﻿namespace Probel.AspTest.Domain
{
    using Probel.AspTest.Domain.Components;

    /*
    This file is part of NDoctor.

    NDoctor is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    NDoctor is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with NDoctor.  If not, see <http://www.gnu.org/licenses/>.
    */
    using StructureMap;

    /// <summary>
    /// Static factory to instanciate the components
    /// </summary>
    public class ComponentFactory
    {
        #region Constructors

        /// <summary>
        /// Initializes the <see cref="ComponentFactory"/> class.
        /// </summary>
        static ComponentFactory()
        {
            ObjectFactory.Configure(e =>
            {
                e.For<IChartComponent>().Use<ChartComponent>();
                e.For<IHomeComponent>().Use<HomeComponent>();
            });
        }

        /// <summary>
        /// Prevents a default instance of the <see cref="ComponentFactory"/> class from being created.
        /// </summary>
        private ComponentFactory()
        {
        }

        #endregion Constructors

        #region Methods

        /// <summary>
        /// Get a fresh instance of the specified TType.
        /// </summary>
        /// <typeparam name="TType">The type to be instanciated.</typeparam>
        /// <returns>A fresh instance</returns>
        public static TType New<TType>()
        {
            return ObjectFactory.GetInstance<TType>();
        }

        #endregion Methods
    }
}